package com;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * CyclicBarrier  可循环使用的屏障
 * 与CountDownLatch相反  CountDownLatch是相减  countDown一次减一个，
 * 减到全部结束之后  await之后的方法才可以执行
 * CyclicBarrier是相加  每await一次  构造方法中设置的到达指定次数才能执行的线程才会执行，
 * 并且await后的方法只有在到达构造方法中指定次数后才可以执行
 */
public class CyclicBarrierTest {
    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
            System.out.println("线程够了 可以开始");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        for (int i = 0; i < 7; i++) {
            final int tempInt = i;
            new Thread(()->{
                System.out.println("第" + (tempInt + 1)  + "开始了");
                try {
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("结束了" + tempInt);
            },i + "").start();

        }
    }
}
